package User.FunctionPkg;

import MySQL_im.getInfo;
import Win.NewSpiderWebPlot;
import Win.OpenWeb;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

public class Data_Analysis extends JPanel implements Win{
    String[] TiZhi = {"平和质","气虚质","阳虚质","阴虚质","痰湿质","湿热质","血瘀质","气郁质","特禀质"};
    ImageIcon img = new ImageIcon("images/答卷背景.jpg");
    getInfo info = new getInfo();
    Connection con = null;
    Statement st = null;
    JFrame frame;
    String user;
    JPanel panel;
    JScrollPane scrollPane;
    JViewport viewport;
    JLabel title = new JLabel("最新数据报告",SwingConstants.CENTER);
    String url = null;
    JLabel time;
    int len=35;
    int[] scores = new int[9];
    int[] th_sc = {100,30,30,30,30,30,30,30,30};
    int[] th_sc_l = {60,40,40,40,40,40,40,40,40};
    String text=null;
    JLabel context;
    //            柱状图
    JFreeChart HiChart;
//    雷达图
    SpiderWebPlot plot;
    JFreeChart RaChart;
    JButton open = new JButton("打开简介",new ImageIcon("images/百度.png"));
    public Data_Analysis(String name){
        user = name;
        url = "SELECT * FROM "+user+"_user";
        frame = new JFrame();
        panel = new JPanel();
        panel.setLayout(null);
        panel.setOpaque(false);
        open.setVerticalTextPosition(SwingConstants.BOTTOM);
        open.setHorizontalTextPosition(SwingConstants.CENTER);
        open.setFont(new Font("楷体",Font.BOLD,18));
        panel.add(title);
        viewport = new JViewport(){
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawImage(img.getImage(),0,0,getWidth(),getHeight(),this);
            }
        };
        title.setFont(new Font("楷体",Font.BOLD,28));
        title.setBounds(0,0,735,30);
        scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        con = info.getConnection();
        ResultSet rt = null;
        try {
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rt = st.executeQuery(url);
            rt.last();
//            设置更新时间
            String day = rt.getString(1);
            time = new JLabel("更新日期："+day,SwingConstants.CENTER);
            time.setBounds(0,len,735,18);
            time.setFont(new Font("宋体",Font.PLAIN,18));
            panel.add(time);
            len+=18;
//            获取数据
            for (int i = 0; i < scores.length; i++) {
                scores[i]=rt.getInt(i+3);
            }
//            分析报告
            text = "亲爱的用户：<br>&emsp;&emsp;您好！您本次中医体质调查问卷结果如下：<br>&emsp;&emsp;平和质："+scores[0]+"分，气虚质："+scores[1]+"分，阳虚质："+scores[2]+"分，阴虚质："+scores[3]+"分，痰湿质："+scores[4]+"分，湿热质："+scores[5]+"分，血瘀质："+scores[6]+"分，气郁质："+scores[7]+"分，特禀质："+scores[8]+"分。<br>&emsp;&emsp;根据判定标准，"+Result();
            context = new JLabel("<html>"+text+"</html>",SwingConstants.CENTER);
            context.setFont(new Font("宋体",Font.PLAIN,20));
            context.setBounds(50,len,600,300);
            panel.add(context);
            len+=context.getHeight();
//绘制柱形图和雷达图
//柱状图
            HiChart = ChartFactory.createBarChart("数据柱状图","中医体质","转化分",getDataSet(),PlotOrientation.VERTICAL,true,true,false);
            BarRenderer renderer = new BarRenderer();
            CategoryPlot plotH = HiChart.getCategoryPlot();
            renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            renderer.setBaseItemLabelsVisible(true);
            plotH.setRenderer(renderer);
            ChartPanel hipanel = new ChartPanel(HiChart);
            panel.add(hipanel);
            hipanel.setBounds(50,len,600,400);
            len += hipanel.getHeight()+30;
//            雷达图
            plot = new NewSpiderWebPlot(getDataSet());
            plot.setLabelFont(new Font("楷体",Font.BOLD,20));
            RaChart = new JFreeChart(plot);
            RaChart.setTitle("数据雷达图");
            ChartPanel rapanel = new ChartPanel(RaChart);
            panel.add(rapanel);
            rapanel.setBounds(50,len,600,600);
            len += rapanel.getHeight()+10;
//            按钮
            open.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    new OpenWeb("https://baike.baidu.com/item/%E4%B8%AD%E5%8C%BB%E4%BD%93%E8%B4%A8/8883451");
                }
            });
            open.setBounds(250,len,200,90);
            panel.add(open);
        } catch (SQLException e) {
            System.out.println(e.toString());;
        }
        init();
    }
    @Override
    public void init() {
        scrollPane.setViewport(viewport);
        scrollPane.setViewportView(panel);
        panel.setPreferredSize(new Dimension(558,1500));
        panel.revalidate();
        Container c = frame.getContentPane();
        c.add(scrollPane,BorderLayout.CENTER);
        frame.setTitle("数据解析");
        frame.setBounds(558,138,735,750);
        frame.setVisible(true);
    }
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img.getImage(), 0, 0, panel);
    }
    public String Result(){
        int PingHe = scores[0];
        int count_30=0;
        int count_40=0;
        int countLT40=0;
        String head=null;
//        倾向数量
        Vector<String> QingXiang = new Vector<>();
//        偏颇
        Vector<String>PP = new Vector<>();
        String ans = null;
//        判断各个分数段满足条件的数量
        for (int i = 1; i < scores.length; i++) {
            if(scores[i]<40)
                count_40++;
            if(scores[i]<30)
                count_30++;
            if(scores[i]<=39 && scores[i]>=30){
                QingXiang.add(TiZhi[i]);
            }
            if(scores[i]>=40){
                countLT40++;
                PP.add(TiZhi[i]);
            }
        }
//        满足平和质的分数情况下
        if(PingHe>=60){
            if(count_30== scores.length-1){
                ans="故您的体质可判定为平和质。";
                head="平质转化分≧60分，同时，其他体质转化分均小于30分，";
            }
            else if(count_40== scores.length-1){
                String QX = String.join("、",QingXiang);
                ans="故您的体质可基本判定为平和质，但有"+QX+"的倾向。";
                head="平质转化分≧60分，同时，其他体质转化分均小于40分，但是其中"+QX+"的转化分介于30~39之间";
            }
            else{
                if(countLT40==1){
                    if(QingXiang.isEmpty()){
                        ans="您的体质应判定为"+PP.firstElement()+"，并且暂无其他体质的明显倾向。";
                        head="虽然平和质转化分≧60分，但其他8种体质转化分并未全部﹤40分，其中"+PP.firstElement()+"转化分≧40分，因此不能判定为平和质，所以";
                    }
                    else{
                        String QX = String.join("、",QingXiang);
                        ans="您的体质应判定为"+PP.firstElement()+"同时，具有"+QX+"的倾向";
                        head="虽然平和质转化分≧60分，但其他8种体质转化分并未全部﹤40分，其中"+PP.firstElement()+"转化分≧40分，因此不能判定为平和质，而且，其中的"+QX+"的转化分介于30~39之间，所以";
                    }
                }
                if(countLT40>1){
                    String Pp = String.join("、",PP);
                    if(QingXiang.isEmpty()){
                        ans="您的体质应判定为"+Pp+"的兼夹体质，且暂无其他体质的明显倾向。";
                        head="虽然平和质转化分≧60分，但其他8种体质转化分并未全部﹤40分，其中"+Pp+"转化分≧40分，因此不能判定为平和质，所以";
                    }
                    else{
                        String QX = String.join("、",QingXiang);
                        ans="您的体质应判定为"+Pp+"的兼夹体质，同时，有"+QX+"的倾向";
                        head="虽然平和质转化分≧60分，但其他8种体质转化分并未全部﹤40分，其中"+Pp+"转化分≧40分，因此不能判定为平和质，而且，其中的"+QX+"的转化分介于30~39之间，所以";
                    }
                }
            }
        }
//        不满足平和质分数的情况下
        else{
            if(countLT40==1){
                if(QingXiang.isEmpty()){
                    ans="您的体质应判定为"+PP.firstElement()+"且暂无其他体质的明显倾向。";
                    head="因为平和质的转化分≤60分，且其他8种体质转化分并未全部﹤40分，其中"+PP.firstElement()+"转化分≧40分，所以";
                }
                else{
                    String QX = String.join("、",QingXiang);
                    ans="您的体质应判定为"+PP.firstElement()+"同时，有"+QX+"的倾向";
                    head="因为平和质的转化分≤60分，且其他8种体质转化分并未全部﹤40分，其中"+QX+"转化分介于30~39分，所以";
                }
            }
            if(countLT40>1){
                String Pp = String.join("、",PP);
                if(QingXiang.isEmpty()){
                    ans="您的体质应判定为"+Pp+"的兼夹体质，暂无其他体质的明显倾向。";
                    head="因为平和质的转化分≤60分，其他8种体质转化分并未全部﹤40分，其中"+Pp+"转化分≧40分，所以";
                }
                else{
                    String QX = String.join("、",QingXiang);
                    ans="您的体质应判定为"+Pp+"的兼夹体质，同时，有"+QX+"的倾向";
                    head="因为平和质的转化分≤60分，其他8种体质转化分并未全部﹤40分，其中"+Pp+"转化分≧40分，而且，其中的"+QX+"的转化分介于30~39之间，所以";
                }
            }
            if(count_40== scores.length-1){
                String QX = String.join("、",QingXiang);
                ans="您的体质应判定为"+QX+"的兼夹体质";
                head="因为平和质的转化分≤60分，且其他8种体质转化分全部﹤40分，其中的"+QX+"的转化分介于30~39之间，所以";
            }
        }
        return head+ans;
    }
    private CategoryDataset getDataSet() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < 9; i++) {
            dataset.addValue(scores[i],user,TiZhi[i]);
            dataset.addValue(th_sc[i],"平和质（理想）",TiZhi[i]);
            dataset.addValue(th_sc_l[i],"平和质（极限）",TiZhi[i]);
        }
        return dataset;
    }
}
